<?xml version='1.0' encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml">
  <head>
    <link href="cpip.css" rel="stylesheet" type="text/css" />
    <title>File: /Users/paulross/dev/linux/linux-3.13/include/linux/log2.h</title>
  </head>
  <body>
    <h1>File: /Users/paulross/dev/linux/linux-3.13/include/linux/log2.h</h1>
    <p>Green shading in the line number column
means the source is part of the translation unit, red means it is conditionally excluded.
Highlighted line numbers link to the translation unit page. Highlighted macros link to
the macro page.</p>
    <pre><a name="1" /><span class="True">       1:</span> <span class="k">/* Integer base 2 logarithm calculation</span>
<a name="2" /><span class="True">       2:</span> <span class="k"> *</span>
<a name="3" /><span class="True">       3:</span> <span class="k"> * Copyright (C) 2006 Red Hat, Inc. All Rights Reserved.</span>
<a name="4" /><span class="True">       4:</span> <span class="k"> * Written by David Howells (dhowells@redhat.com)</span>
<a name="5" /><span class="True">       5:</span> <span class="k"> *</span>
<a name="6" /><span class="True">       6:</span> <span class="k"> * This program is free software; you can redistribute it and/or</span>
<a name="7" /><span class="True">       7:</span> <span class="k"> * modify it under the terms of the GNU General Public License</span>
<a name="8" /><span class="True">       8:</span> <span class="k"> * as published by the Free Software Foundation; either version</span>
<a name="9" /><span class="True">       9:</span> <span class="k"> * 2 of the License, or (at your option) any later version.</span>
<a name="10" /><span class="True">      10:</span> <span class="k"> */</span>
<a name="11" /><span class="True">      11:</span> 
<a name="12" /><span class="Maybe">      12:</span> <span class="f">#</span><span class="n">ifndef</span> <a href="cpu.c_macros_ref.html#_X0xJTlVYX0xPRzJfSF8w"><span class="b">_LINUX_LOG2_H</span></a>
<a name="13" /><span class="Maybe">      13:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_X0xJTlVYX0xPRzJfSF8w"><span class="b">_LINUX_LOG2_H</span></a>
<a name="14" /><span class="Maybe">      14:</span> 
<a name="15" /><span class="Maybe">      15:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">types</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="16" /><span class="Maybe">      16:</span> <span class="f">#</span><span class="n">include</span> <span class="f">&lt;</span><span class="b">linux</span><span class="f">/</span><span class="b">bitops</span><span class="f">.</span><span class="b">h</span><span class="f">&gt;</span>
<a name="17" /><span class="Maybe">      17:</span> 
<a name="18" /><span class="Maybe">      18:</span> <span class="k">/*</span>
<a name="19" /><span class="Maybe">      19:</span> <span class="k"> * deal with unrepresentable constant logarithms</span>
<a name="20" /><span class="Maybe">      20:</span> <span class="k"> */</span>
<a name="21" /><span class="Maybe">      21:</span> <span class="m">extern</span> <span class="b">__attribute__</span><span class="f">(</span><span class="f">(</span><span class="m">const</span><span class="f">,</span> <span class="b">noreturn</span><span class="f">)</span><span class="f">)</span>
<a name="22" /><span class="Maybe">      22:</span> <span class="m">int</span> <span class="b">____ilog2_NaN</span><span class="f">(</span><span class="m">void</span><span class="f">)</span><span class="f">;</span>
<a name="23" /><span class="Maybe">      23:</span> 
<a name="24" /><span class="Maybe">      24:</span> <span class="k">/*</span>
<a name="25" /><span class="Maybe">      25:</span> <span class="k"> * non-constant log of base 2 calculators</span>
<a name="26" /><span class="Maybe">      26:</span> <span class="k"> * - the arch may override these in asm/bitops.h if they can be implemented</span>
<a name="27" /><span class="Maybe">      27:</span> <span class="k"> *   more efficiently than using fls() and fls64()</span>
<a name="28" /><span class="Maybe">      28:</span> <span class="k"> * - the arch is not required to handle n==0 if implementing the fallback</span>
<a name="29" /><span class="Maybe">      29:</span> <span class="k"> */</span>
<a name="30" /><span class="Maybe">      30:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">CONFIG_ARCH_HAS_ILOG2_U32</span>
<a name="31" /><span class="Maybe">      31:</span> <span class="m">static</span> <span class="m">inline</span> <span class="b">__attribute__</span><span class="f">(</span><span class="f">(</span><span class="m">const</span><span class="f">)</span><span class="f">)</span>
<a name="32" /><span class="Maybe">      32:</span> <span class="m">int</span> <span class="b">__ilog2_u32</span><span class="f">(</span><a href="cpu.c_macros_ref.html#_dTMyXzA_"><span class="b">u32</span></a> <span class="b">n</span><span class="f">)</span>
<a name="33" /><span class="Maybe">      33:</span> <span class="f">{</span>
<a name="34" /><span class="Maybe">      34:</span>     <span class="m">return</span> <span class="b">fls</span><span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">-</span> <span class="c">1</span><span class="f">;</span>
<a name="35" /><span class="Maybe">      35:</span> <span class="f">}</span>
<a name="36" /><span class="Maybe">      36:</span> <span class="f">#</span><span class="n">endif</span>
<a name="37" /><span class="Maybe">      37:</span> 
<a name="38" /><span class="Maybe">      38:</span> <span class="f">#</span><span class="n">ifndef</span> <span class="b">CONFIG_ARCH_HAS_ILOG2_U64</span>
<a name="39" /><span class="Maybe">      39:</span> <span class="m">static</span> <span class="m">inline</span> <span class="b">__attribute__</span><span class="f">(</span><span class="f">(</span><span class="m">const</span><span class="f">)</span><span class="f">)</span>
<a name="40" /><span class="Maybe">      40:</span> <span class="m">int</span> <span class="b">__ilog2_u64</span><span class="f">(</span><span class="b">u64</span> <span class="b">n</span><span class="f">)</span>
<a name="41" /><span class="Maybe">      41:</span> <span class="f">{</span>
<a name="42" /><span class="Maybe">      42:</span>     <span class="m">return</span> <span class="b">fls64</span><span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">-</span> <span class="c">1</span><span class="f">;</span>
<a name="43" /><span class="Maybe">      43:</span> <span class="f">}</span>
<a name="44" /><span class="Maybe">      44:</span> <span class="f">#</span><span class="n">endif</span>
<a name="45" /><span class="Maybe">      45:</span> 
<a name="46" /><span class="Maybe">      46:</span> <span class="k">/*</span>
<a name="47" /><span class="Maybe">      47:</span> <span class="k"> *  Determine whether some value is a power of two, where zero is</span>
<a name="48" /><span class="Maybe">      48:</span> <span class="k"> * *not* considered a power of two.</span>
<a name="49" /><span class="Maybe">      49:</span> <span class="k"> */</span>
<a name="50" /><span class="Maybe">      50:</span> 
<a name="51" /><span class="Maybe">      51:</span> <span class="m">static</span> <span class="m">inline</span> <span class="b">__attribute__</span><span class="f">(</span><span class="f">(</span><span class="m">const</span><span class="f">)</span><span class="f">)</span>
<a name="52" /><span class="Maybe">      52:</span> <span class="m">bool</span> <span class="b">is_power_of_2</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span> <span class="b">n</span><span class="f">)</span>
<a name="53" /><span class="Maybe">      53:</span> <span class="f">{</span>
<a name="54" /><span class="Maybe">      54:</span>     <span class="m">return</span> <span class="f">(</span><span class="b">n</span> <span class="f">!=</span> <span class="c">0</span> <span class="f">&amp;&amp;</span> <span class="f">(</span><span class="f">(</span><span class="b">n</span> <span class="f">&amp;</span> <span class="f">(</span><span class="b">n</span> <span class="f">-</span> <span class="c">1</span><span class="f">)</span><span class="f">)</span> <span class="f">==</span> <span class="c">0</span><span class="f">)</span><span class="f">)</span><span class="f">;</span>
<a name="55" /><span class="Maybe">      55:</span> <span class="f">}</span>
<a name="56" /><span class="Maybe">      56:</span> 
<a name="57" /><span class="Maybe">      57:</span> <span class="k">/*</span>
<a name="58" /><span class="Maybe">      58:</span> <span class="k"> * round up to nearest power of two</span>
<a name="59" /><span class="Maybe">      59:</span> <span class="k"> */</span>
<a name="60" /><span class="Maybe">      60:</span> <span class="m">static</span> <span class="m">inline</span> <span class="b">__attribute__</span><span class="f">(</span><span class="f">(</span><span class="m">const</span><span class="f">)</span><span class="f">)</span>
<a name="61" /><span class="Maybe">      61:</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">__roundup_pow_of_two</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span> <span class="b">n</span><span class="f">)</span>
<a name="62" /><span class="Maybe">      62:</span> <span class="f">{</span>
<a name="63" /><span class="Maybe">      63:</span>     <span class="m">return</span> <span class="c">1UL</span> <span class="f">&lt;&lt;</span> <span class="b">fls_long</span><span class="f">(</span><span class="b">n</span> <span class="f">-</span> <span class="c">1</span><span class="f">)</span><span class="f">;</span>
<a name="64" /><span class="Maybe">      64:</span> <span class="f">}</span>
<a name="65" /><span class="Maybe">      65:</span> 
<a name="66" /><span class="Maybe">      66:</span> <span class="k">/*</span>
<a name="67" /><span class="Maybe">      67:</span> <span class="k"> * round down to nearest power of two</span>
<a name="68" /><span class="Maybe">      68:</span> <span class="k"> */</span>
<a name="69" /><span class="Maybe">      69:</span> <span class="m">static</span> <span class="m">inline</span> <span class="b">__attribute__</span><span class="f">(</span><span class="f">(</span><span class="m">const</span><span class="f">)</span><span class="f">)</span>
<a name="70" /><span class="Maybe">      70:</span> <span class="m">unsigned</span> <span class="m">long</span> <span class="b">__rounddown_pow_of_two</span><span class="f">(</span><span class="m">unsigned</span> <span class="m">long</span> <span class="b">n</span><span class="f">)</span>
<a name="71" /><span class="Maybe">      71:</span> <span class="f">{</span>
<a name="72" /><span class="Maybe">      72:</span>     <span class="m">return</span> <span class="c">1UL</span> <span class="f">&lt;&lt;</span> <span class="f">(</span><span class="b">fls_long</span><span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">-</span> <span class="c">1</span><span class="f">)</span><span class="f">;</span>
<a name="73" /><span class="Maybe">      73:</span> <span class="f">}</span>
<a name="74" /><span class="Maybe">      74:</span> 
<a name="75" /><span class="Maybe">      75:</span> <span class="k">/**</span>
<a name="76" /><span class="Maybe">      76:</span> <span class="k"> * ilog2 - log of base 2 of 32-bit or a 64-bit unsigned value</span>
<a name="77" /><span class="Maybe">      77:</span> <span class="k"> * @n - parameter</span>
<a name="78" /><span class="Maybe">      78:</span> <span class="k"> *</span>
<a name="79" /><span class="Maybe">      79:</span> <span class="k"> * constant-capable log of base 2 calculation</span>
<a name="80" /><span class="Maybe">      80:</span> <span class="k"> * - this can be used to initialise global variables from constant data, hence</span>
<a name="81" /><span class="Maybe">      81:</span> <span class="k"> *   the massive ternary operator construction</span>
<a name="82" /><span class="Maybe">      82:</span> <span class="k"> *</span>
<a name="83" /><span class="Maybe">      83:</span> <span class="k"> * selects the appropriately-sized optimised version depending on sizeof(n)</span>
<a name="84" /><span class="Maybe">      84:</span> <span class="k"> */</span>
<a name="85" /><span class="Maybe">      85:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_ref.html#_aWxvZzJfMA__"><span class="b">ilog2</span></a><span class="f">(</span><span class="b">n</span><span class="f">)</span>                \
<a name="86" /><span class="Maybe">      86:</span> <span class="f">(</span>                        \
<a name="87" /><span class="Maybe">      87:</span>     <span class="b">__builtin_constant_p</span><span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">?</span> <span class="f">(</span>        \
<a name="88" /><span class="Maybe">      88:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&lt;</span> <span class="c">1</span> <span class="f">?</span> <span class="b">____ilog2_NaN</span><span class="f">(</span><span class="f">)</span> <span class="f">:</span>    \
<a name="89" /><span class="Maybe">      89:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">63</span><span class="f">)</span> <span class="f">?</span> <span class="c">63</span> <span class="f">:</span>    \
<a name="90" /><span class="Maybe">      90:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">62</span><span class="f">)</span> <span class="f">?</span> <span class="c">62</span> <span class="f">:</span>    \
<a name="91" /><span class="Maybe">      91:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">61</span><span class="f">)</span> <span class="f">?</span> <span class="c">61</span> <span class="f">:</span>    \
<a name="92" /><span class="Maybe">      92:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">60</span><span class="f">)</span> <span class="f">?</span> <span class="c">60</span> <span class="f">:</span>    \
<a name="93" /><span class="Maybe">      93:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">59</span><span class="f">)</span> <span class="f">?</span> <span class="c">59</span> <span class="f">:</span>    \
<a name="94" /><span class="Maybe">      94:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">58</span><span class="f">)</span> <span class="f">?</span> <span class="c">58</span> <span class="f">:</span>    \
<a name="95" /><span class="Maybe">      95:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">57</span><span class="f">)</span> <span class="f">?</span> <span class="c">57</span> <span class="f">:</span>    \
<a name="96" /><span class="Maybe">      96:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">56</span><span class="f">)</span> <span class="f">?</span> <span class="c">56</span> <span class="f">:</span>    \
<a name="97" /><span class="Maybe">      97:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">55</span><span class="f">)</span> <span class="f">?</span> <span class="c">55</span> <span class="f">:</span>    \
<a name="98" /><span class="Maybe">      98:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">54</span><span class="f">)</span> <span class="f">?</span> <span class="c">54</span> <span class="f">:</span>    \
<a name="99" /><span class="Maybe">      99:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">53</span><span class="f">)</span> <span class="f">?</span> <span class="c">53</span> <span class="f">:</span>    \
<a name="100" /><span class="Maybe">     100:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">52</span><span class="f">)</span> <span class="f">?</span> <span class="c">52</span> <span class="f">:</span>    \
<a name="101" /><span class="Maybe">     101:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">51</span><span class="f">)</span> <span class="f">?</span> <span class="c">51</span> <span class="f">:</span>    \
<a name="102" /><span class="Maybe">     102:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">50</span><span class="f">)</span> <span class="f">?</span> <span class="c">50</span> <span class="f">:</span>    \
<a name="103" /><span class="Maybe">     103:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">49</span><span class="f">)</span> <span class="f">?</span> <span class="c">49</span> <span class="f">:</span>    \
<a name="104" /><span class="Maybe">     104:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">48</span><span class="f">)</span> <span class="f">?</span> <span class="c">48</span> <span class="f">:</span>    \
<a name="105" /><span class="Maybe">     105:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">47</span><span class="f">)</span> <span class="f">?</span> <span class="c">47</span> <span class="f">:</span>    \
<a name="106" /><span class="Maybe">     106:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">46</span><span class="f">)</span> <span class="f">?</span> <span class="c">46</span> <span class="f">:</span>    \
<a name="107" /><span class="Maybe">     107:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">45</span><span class="f">)</span> <span class="f">?</span> <span class="c">45</span> <span class="f">:</span>    \
<a name="108" /><span class="Maybe">     108:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">44</span><span class="f">)</span> <span class="f">?</span> <span class="c">44</span> <span class="f">:</span>    \
<a name="109" /><span class="Maybe">     109:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">43</span><span class="f">)</span> <span class="f">?</span> <span class="c">43</span> <span class="f">:</span>    \
<a name="110" /><span class="Maybe">     110:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">42</span><span class="f">)</span> <span class="f">?</span> <span class="c">42</span> <span class="f">:</span>    \
<a name="111" /><span class="Maybe">     111:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">41</span><span class="f">)</span> <span class="f">?</span> <span class="c">41</span> <span class="f">:</span>    \
<a name="112" /><span class="Maybe">     112:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">40</span><span class="f">)</span> <span class="f">?</span> <span class="c">40</span> <span class="f">:</span>    \
<a name="113" /><span class="Maybe">     113:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">39</span><span class="f">)</span> <span class="f">?</span> <span class="c">39</span> <span class="f">:</span>    \
<a name="114" /><span class="Maybe">     114:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">38</span><span class="f">)</span> <span class="f">?</span> <span class="c">38</span> <span class="f">:</span>    \
<a name="115" /><span class="Maybe">     115:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">37</span><span class="f">)</span> <span class="f">?</span> <span class="c">37</span> <span class="f">:</span>    \
<a name="116" /><span class="Maybe">     116:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">36</span><span class="f">)</span> <span class="f">?</span> <span class="c">36</span> <span class="f">:</span>    \
<a name="117" /><span class="Maybe">     117:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">35</span><span class="f">)</span> <span class="f">?</span> <span class="c">35</span> <span class="f">:</span>    \
<a name="118" /><span class="Maybe">     118:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">34</span><span class="f">)</span> <span class="f">?</span> <span class="c">34</span> <span class="f">:</span>    \
<a name="119" /><span class="Maybe">     119:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">33</span><span class="f">)</span> <span class="f">?</span> <span class="c">33</span> <span class="f">:</span>    \
<a name="120" /><span class="Maybe">     120:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">32</span><span class="f">)</span> <span class="f">?</span> <span class="c">32</span> <span class="f">:</span>    \
<a name="121" /><span class="Maybe">     121:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">31</span><span class="f">)</span> <span class="f">?</span> <span class="c">31</span> <span class="f">:</span>    \
<a name="122" /><span class="Maybe">     122:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">30</span><span class="f">)</span> <span class="f">?</span> <span class="c">30</span> <span class="f">:</span>    \
<a name="123" /><span class="Maybe">     123:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">29</span><span class="f">)</span> <span class="f">?</span> <span class="c">29</span> <span class="f">:</span>    \
<a name="124" /><span class="Maybe">     124:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">28</span><span class="f">)</span> <span class="f">?</span> <span class="c">28</span> <span class="f">:</span>    \
<a name="125" /><span class="Maybe">     125:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">27</span><span class="f">)</span> <span class="f">?</span> <span class="c">27</span> <span class="f">:</span>    \
<a name="126" /><span class="Maybe">     126:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">26</span><span class="f">)</span> <span class="f">?</span> <span class="c">26</span> <span class="f">:</span>    \
<a name="127" /><span class="Maybe">     127:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">25</span><span class="f">)</span> <span class="f">?</span> <span class="c">25</span> <span class="f">:</span>    \
<a name="128" /><span class="Maybe">     128:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">24</span><span class="f">)</span> <span class="f">?</span> <span class="c">24</span> <span class="f">:</span>    \
<a name="129" /><span class="Maybe">     129:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">23</span><span class="f">)</span> <span class="f">?</span> <span class="c">23</span> <span class="f">:</span>    \
<a name="130" /><span class="Maybe">     130:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">22</span><span class="f">)</span> <span class="f">?</span> <span class="c">22</span> <span class="f">:</span>    \
<a name="131" /><span class="Maybe">     131:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">21</span><span class="f">)</span> <span class="f">?</span> <span class="c">21</span> <span class="f">:</span>    \
<a name="132" /><span class="Maybe">     132:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">20</span><span class="f">)</span> <span class="f">?</span> <span class="c">20</span> <span class="f">:</span>    \
<a name="133" /><span class="Maybe">     133:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">19</span><span class="f">)</span> <span class="f">?</span> <span class="c">19</span> <span class="f">:</span>    \
<a name="134" /><span class="Maybe">     134:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">18</span><span class="f">)</span> <span class="f">?</span> <span class="c">18</span> <span class="f">:</span>    \
<a name="135" /><span class="Maybe">     135:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">17</span><span class="f">)</span> <span class="f">?</span> <span class="c">17</span> <span class="f">:</span>    \
<a name="136" /><span class="Maybe">     136:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">16</span><span class="f">)</span> <span class="f">?</span> <span class="c">16</span> <span class="f">:</span>    \
<a name="137" /><span class="Maybe">     137:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">15</span><span class="f">)</span> <span class="f">?</span> <span class="c">15</span> <span class="f">:</span>    \
<a name="138" /><span class="Maybe">     138:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">14</span><span class="f">)</span> <span class="f">?</span> <span class="c">14</span> <span class="f">:</span>    \
<a name="139" /><span class="Maybe">     139:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">13</span><span class="f">)</span> <span class="f">?</span> <span class="c">13</span> <span class="f">:</span>    \
<a name="140" /><span class="Maybe">     140:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">12</span><span class="f">)</span> <span class="f">?</span> <span class="c">12</span> <span class="f">:</span>    \
<a name="141" /><span class="Maybe">     141:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">11</span><span class="f">)</span> <span class="f">?</span> <span class="c">11</span> <span class="f">:</span>    \
<a name="142" /><span class="Maybe">     142:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span> <span class="c">10</span><span class="f">)</span> <span class="f">?</span> <span class="c">10</span> <span class="f">:</span>    \
<a name="143" /><span class="Maybe">     143:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span>  <span class="c">9</span><span class="f">)</span> <span class="f">?</span>  <span class="c">9</span> <span class="f">:</span>    \
<a name="144" /><span class="Maybe">     144:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span>  <span class="c">8</span><span class="f">)</span> <span class="f">?</span>  <span class="c">8</span> <span class="f">:</span>    \
<a name="145" /><span class="Maybe">     145:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span>  <span class="c">7</span><span class="f">)</span> <span class="f">?</span>  <span class="c">7</span> <span class="f">:</span>    \
<a name="146" /><span class="Maybe">     146:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span>  <span class="c">6</span><span class="f">)</span> <span class="f">?</span>  <span class="c">6</span> <span class="f">:</span>    \
<a name="147" /><span class="Maybe">     147:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span>  <span class="c">5</span><span class="f">)</span> <span class="f">?</span>  <span class="c">5</span> <span class="f">:</span>    \
<a name="148" /><span class="Maybe">     148:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span>  <span class="c">4</span><span class="f">)</span> <span class="f">?</span>  <span class="c">4</span> <span class="f">:</span>    \
<a name="149" /><span class="Maybe">     149:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span>  <span class="c">3</span><span class="f">)</span> <span class="f">?</span>  <span class="c">3</span> <span class="f">:</span>    \
<a name="150" /><span class="Maybe">     150:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span>  <span class="c">2</span><span class="f">)</span> <span class="f">?</span>  <span class="c">2</span> <span class="f">:</span>    \
<a name="151" /><span class="Maybe">     151:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span>  <span class="c">1</span><span class="f">)</span> <span class="f">?</span>  <span class="c">1</span> <span class="f">:</span>    \
<a name="152" /><span class="Maybe">     152:</span>         <span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&amp;</span> <span class="f">(</span><span class="c">1ULL</span> <span class="f">&lt;&lt;</span>  <span class="c">0</span><span class="f">)</span> <span class="f">?</span>  <span class="c">0</span> <span class="f">:</span>    \
<a name="153" /><span class="Maybe">     153:</span>         <span class="b">____ilog2_NaN</span><span class="f">(</span><span class="f">)</span>            \
<a name="154" /><span class="Maybe">     154:</span>                    <span class="f">)</span> <span class="f">:</span>        \
<a name="155" /><span class="Maybe">     155:</span>     <span class="f">(</span><span class="m">sizeof</span><span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">&lt;=</span> <span class="c">4</span><span class="f">)</span> <span class="f">?</span>            \
<a name="156" /><span class="Maybe">     156:</span>     <span class="b">__ilog2_u32</span><span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">:</span>            \
<a name="157" /><span class="Maybe">     157:</span>     <span class="b">__ilog2_u64</span><span class="f">(</span><span class="b">n</span><span class="f">)</span>                \
<a name="158" /><span class="Maybe">     158:</span>  <span class="f">)</span>
<a name="159" /><span class="Maybe">     159:</span> 
<a name="160" /><span class="Maybe">     160:</span> <span class="k">/**</span>
<a name="161" /><span class="Maybe">     161:</span> <span class="k"> * roundup_pow_of_two - round the given value up to nearest power of two</span>
<a name="162" /><span class="Maybe">     162:</span> <span class="k"> * @n - parameter</span>
<a name="163" /><span class="Maybe">     163:</span> <span class="k"> *</span>
<a name="164" /><span class="Maybe">     164:</span> <span class="k"> * round the given value up to the nearest power of two</span>
<a name="165" /><span class="Maybe">     165:</span> <span class="k"> * - the result is undefined when n == 0</span>
<a name="166" /><span class="Maybe">     166:</span> <span class="k"> * - this can be used to initialise global variables from constant data</span>
<a name="167" /><span class="Maybe">     167:</span> <span class="k"> */</span>
<a name="168" /><span class="Maybe">     168:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_cm91bmR1cF9wb3dfb2ZfdHdvXzA_"><span class="b">roundup_pow_of_two</span></a><span class="f">(</span><span class="b">n</span><span class="f">)</span>            \
<a name="169" /><span class="Maybe">     169:</span> <span class="f">(</span>                        \
<a name="170" /><span class="Maybe">     170:</span>     <span class="b">__builtin_constant_p</span><span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">?</span> <span class="f">(</span>        \
<a name="171" /><span class="Maybe">     171:</span>         <span class="f">(</span><span class="b">n</span> <span class="f">==</span> <span class="c">1</span><span class="f">)</span> <span class="f">?</span> <span class="c">1</span> <span class="f">:</span>            \
<a name="172" /><span class="Maybe">     172:</span>         <span class="f">(</span><span class="c">1UL</span> <span class="f">&lt;&lt;</span> <span class="f">(</span><a href="cpu.c_macros_ref.html#_aWxvZzJfMA__"><span class="b">ilog2</span></a><span class="f">(</span><span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">-</span> <span class="c">1</span><span class="f">)</span> <span class="f">+</span> <span class="c">1</span><span class="f">)</span><span class="f">)</span>    \
<a name="173" /><span class="Maybe">     173:</span>                    <span class="f">)</span> <span class="f">:</span>        \
<a name="174" /><span class="Maybe">     174:</span>     <span class="b">__roundup_pow_of_two</span><span class="f">(</span><span class="b">n</span><span class="f">)</span>            \
<a name="175" /><span class="Maybe">     175:</span>  <span class="f">)</span>
<a name="176" /><span class="Maybe">     176:</span> 
<a name="177" /><span class="Maybe">     177:</span> <span class="k">/**</span>
<a name="178" /><span class="Maybe">     178:</span> <span class="k"> * rounddown_pow_of_two - round the given value down to nearest power of two</span>
<a name="179" /><span class="Maybe">     179:</span> <span class="k"> * @n - parameter</span>
<a name="180" /><span class="Maybe">     180:</span> <span class="k"> *</span>
<a name="181" /><span class="Maybe">     181:</span> <span class="k"> * round the given value down to the nearest power of two</span>
<a name="182" /><span class="Maybe">     182:</span> <span class="k"> * - the result is undefined when n == 0</span>
<a name="183" /><span class="Maybe">     183:</span> <span class="k"> * - this can be used to initialise global variables from constant data</span>
<a name="184" /><span class="Maybe">     184:</span> <span class="k"> */</span>
<a name="185" /><span class="Maybe">     185:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_cm91bmRkb3duX3Bvd19vZl90d29fMA__"><span class="b">rounddown_pow_of_two</span></a><span class="f">(</span><span class="b">n</span><span class="f">)</span>            \
<a name="186" /><span class="Maybe">     186:</span> <span class="f">(</span>                        \
<a name="187" /><span class="Maybe">     187:</span>     <span class="b">__builtin_constant_p</span><span class="f">(</span><span class="b">n</span><span class="f">)</span> <span class="f">?</span> <span class="f">(</span>        \
<a name="188" /><span class="Maybe">     188:</span>         <span class="f">(</span><span class="c">1UL</span> <span class="f">&lt;&lt;</span> <a href="cpu.c_macros_ref.html#_aWxvZzJfMA__"><span class="b">ilog2</span></a><span class="f">(</span><span class="b">n</span><span class="f">)</span><span class="f">)</span><span class="f">)</span> <span class="f">:</span>        \
<a name="189" /><span class="Maybe">     189:</span>     <span class="b">__rounddown_pow_of_two</span><span class="f">(</span><span class="b">n</span><span class="f">)</span>        \
<a name="190" /><span class="Maybe">     190:</span>  <span class="f">)</span>
<a name="191" /><span class="Maybe">     191:</span> 
<a name="192" /><span class="Maybe">     192:</span> <span class="k">/**</span>
<a name="193" /><span class="Maybe">     193:</span> <span class="k"> * order_base_2 - calculate the (rounded up) base 2 order of the argument</span>
<a name="194" /><span class="Maybe">     194:</span> <span class="k"> * @n: parameter</span>
<a name="195" /><span class="Maybe">     195:</span> <span class="k"> *</span>
<a name="196" /><span class="Maybe">     196:</span> <span class="k"> * The first few values calculated by this routine:</span>
<a name="197" /><span class="Maybe">     197:</span> <span class="k"> *  ob2(0) = 0</span>
<a name="198" /><span class="Maybe">     198:</span> <span class="k"> *  ob2(1) = 0</span>
<a name="199" /><span class="Maybe">     199:</span> <span class="k"> *  ob2(2) = 1</span>
<a name="200" /><span class="Maybe">     200:</span> <span class="k"> *  ob2(3) = 2</span>
<a name="201" /><span class="Maybe">     201:</span> <span class="k"> *  ob2(4) = 2</span>
<a name="202" /><span class="Maybe">     202:</span> <span class="k"> *  ob2(5) = 3</span>
<a name="203" /><span class="Maybe">     203:</span> <span class="k"> *  ... and so on.</span>
<a name="204" /><span class="Maybe">     204:</span> <span class="k"> */</span>
<a name="205" /><span class="Maybe">     205:</span> 
<a name="206" /><span class="Maybe">     206:</span> <span class="f">#</span><span class="n">define</span> <a href="cpu.c_macros_noref.html#_b3JkZXJfYmFzZV8yXzA_"><span class="b">order_base_2</span></a><span class="f">(</span><span class="b">n</span><span class="f">)</span> <a href="cpu.c_macros_ref.html#_aWxvZzJfMA__"><span class="b">ilog2</span></a><span class="f">(</span><a href="cpu.c_macros_noref.html#_cm91bmR1cF9wb3dfb2ZfdHdvXzA_"><span class="b">roundup_pow_of_two</span></a><span class="f">(</span><span class="b">n</span><span class="f">)</span><span class="f">)</span>
<a name="207" /><span class="Maybe">     207:</span> 
<a name="208" /><span class="True">     208:</span> <span class="f">#</span><span class="n">endif</span> <span class="k">/* _LINUX_LOG2_H */</span>
<a name="209" /><span class="True">     209:</span> </pre>
  </body>
</html>
